home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / gtlayout-source.lha / LTP_LayoutGadgets.c < prev    next >
C/C++ Source or Header  |  1995-09-24  |  28KB  |  990 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1995 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. #ifdef DO_BOOPSI_KIND
  10. STATIC VOID __regargs
  11. LocalAddPart(STRPTR Base,STRPTR Name)
  12. {
  13.     LONG Len = strlen(Base);
  14.  
  15.     if(Base[Len - 1] != ':')
  16.         strcat(Base,"/");
  17.  
  18.     strcat(Base,Name);
  19. }
  20.  
  21. STATIC struct Library * __regargs
  22. OpenClass(STRPTR Name)
  23. {
  24.     struct Library *Result;
  25.  
  26.     if(!(Result = OpenLibrary(Name,0)))
  27.     {
  28.         struct Process    *Process = (struct Process *)FindTask(NULL);
  29.         UBYTE         LocalBuffer[256];
  30.         LONG         i,Len;
  31.  
  32.         Len = strlen(Name);
  33.  
  34.         for(i = Len - 1 ; i >= 0 ; i--)
  35.         {
  36.             if(Name[i] == '/' || Name[i] == ':')
  37.             {
  38.                 Name = &Name[i + 1];
  39.  
  40.                 break;
  41.             }
  42.         }
  43.  
  44.         if(Process -> pr_Task . tc_Node . ln_Type == NT_PROCESS && Process -> pr_HomeDir)
  45.         {
  46.             strcpy(LocalBuffer,"PROGDIR:Classes/Gadgets");
  47.             LocalAddPart(LocalBuffer,Name);
  48.  
  49.             Result = OpenLibrary(LocalBuffer,0);
  50.         }
  51.  
  52.         if(!Result)
  53.         {
  54.             strcpy(LocalBuffer,":Classes/Gadgets");
  55.             LocalAddPart(LocalBuffer,Name);
  56.  
  57.             if(!(Result = OpenLibrary(LocalBuffer,0)))
  58.             {
  59.                 strcpy(LocalBuffer,"Gadgets");
  60.                 LocalAddPart(LocalBuffer,Name);
  61.  
  62.                 if(!(Result = OpenLibrary(LocalBuffer,0)))
  63.                     Result = OpenLibrary(Name,0);
  64.             }
  65.         }
  66.     }
  67.  
  68.     return(Result);
  69. }
  70. #endif    /* DO_BOOPSI_KIND */
  71.  
  72.  
  73. /*****************************************************************************/
  74.  
  75.  
  76. VOID __regargs
  77. LTP_LayoutGadgets(LayoutHandle *Handle,ObjectNode *Group,LONG Left,LONG Top,LONG PlusWidth,LONG PlusHeight)
  78. {
  79.     if(!Handle -> Failed)
  80.     {
  81.         STATIC struct TagItem NoUnderscoreVanillaTags[] =
  82.         {
  83.             {TAG_DONE}
  84.         };
  85.  
  86.         STATIC struct TagItem VanillaTags[] =
  87.         {
  88.             {GT_Underscore, '_'},
  89.             {TAG_DONE}
  90.         };
  91.  
  92.         STATIC struct TagItem DisabledTags[] =
  93.         {
  94.             {GT_Underscore, '_' },
  95.             {GA_Disabled,    TRUE},
  96.             {TAG_DONE}
  97.         };
  98.  
  99.         STATIC struct TagItem NoUnderscoreDisabledTags[] =
  100.         {
  101.             {GA_Disabled,    TRUE},
  102.             {TAG_DONE}
  103.         };
  104.  
  105.         struct NewGadget     NewGadget;
  106.  
  107.         struct Gadget        *Gadget,
  108.                     *Extra;
  109.         struct TagItem        *Tags;
  110.         ULONG             page;
  111.         ObjectNode        *Node;
  112.  
  113.         if(!Handle -> List)
  114.         {
  115.             if(!(Handle -> Previous = CreateContext(&Handle -> List)))
  116.             {
  117.                 Handle -> Failed = TRUE;
  118.  
  119.                 return;
  120.             }
  121.         }
  122.  
  123.         NewGadget . ng_TextAttr   = Handle -> TextAttr;
  124.         NewGadget . ng_VisualInfo = Handle -> VisualInfo;
  125.  
  126.         Group -> Special . Group . Visible = TRUE;
  127.  
  128.         SCANPAGE(Group,Node,page)
  129.         {
  130.             if(Node -> Type != FRAME_KIND && Node -> Type != BOX_KIND && Node -> Type != XBAR_KIND && Node -> Type != YBAR_KIND)
  131.             {
  132.                 Extra = NULL;
  133.  
  134.                 if(Node -> GroupIndent)
  135.                 {
  136.                     NewGadget . ng_LeftEdge = Node -> Left + 4;
  137.                     NewGadget . ng_TopEdge    = Node -> Top + 2;
  138.                     NewGadget . ng_Width    = Node -> Width - (4 + 4);
  139.                     NewGadget . ng_Height    = Node -> Height - (2 + 2);
  140.                 }
  141.                 else
  142.                 {
  143.                     NewGadget . ng_LeftEdge = Node -> Left;
  144.                     NewGadget . ng_TopEdge    = Node -> Top;
  145.                     NewGadget . ng_Width    = Node -> Width;
  146.                     NewGadget . ng_Height    = Node -> Height;
  147.                 }
  148.  
  149.                 NewGadget . ng_GadgetText    = Node -> Label ? Node -> Label : (STRPTR)"";
  150.                 NewGadget . ng_GadgetID     = Node -> ID;
  151.                 NewGadget . ng_UserData     = Node;
  152.  
  153.                 if(Node -> NoKey)
  154.                 {
  155.                     if(Node -> Disabled)
  156.                     {
  157.                         if(!V39 && (Node -> Type == MX_KIND || Node -> Type == LISTVIEW_KIND))
  158.                             Tags = NoUnderscoreVanillaTags;
  159.                         else
  160.                             Tags = NoUnderscoreDisabledTags;
  161.                     }
  162.                     else
  163.                         Tags = NoUnderscoreVanillaTags;
  164.                 }
  165.                 else
  166.                 {
  167.                     if(Node -> Disabled)
  168.                     {
  169.                         if(!V39 && (Node -> Type == MX_KIND || Node -> Type == LISTVIEW_KIND))
  170.                             Tags = VanillaTags;
  171.                         else
  172.                             Tags = DisabledTags;
  173.                     }
  174.                     else
  175.                         Tags = VanillaTags;
  176.                 }
  177.  
  178.                 switch(Node -> LabelPlace)
  179.                 {
  180.                     case PLACE_LEFT:
  181.  
  182.                         NewGadget . ng_Flags = PLACETEXT_LEFT;
  183.                         break;
  184.  
  185.                     case PLACE_RIGHT:
  186.  
  187.                         NewGadget . ng_Flags = PLACETEXT_RIGHT;
  188.                         break;
  189.  
  190.                     case PLACE_ABOVE:
  191.  
  192.                         NewGadget . ng_Flags = PLACETEXT_ABOVE;
  193.                         break;
  194.  
  195.                     case PLACE_BELOW:
  196.  
  197.                         NewGadget . ng_Flags = PLACETEXT_BELOW;
  198.                         break;
  199.  
  200.                     case PLACE_IN:
  201.  
  202.                         NewGadget . ng_Flags = PLACETEXT_IN;
  203.                         break;
  204.  
  205.                     default:
  206.  
  207.                         NewGadget . ng_Flags = NULL;
  208.                         break;
  209.                 }
  210.  
  211.                 if(Node -> HighLabel)
  212.                     NewGadget . ng_Flags |= NG_HIGHLABEL;
  213.  
  214.                 switch(Node -> Type)
  215.                 {
  216. #ifdef DO_BOOPSI_KIND
  217.                     case BOOPSI_KIND:
  218.                     {
  219.                         struct Gadget *Link;
  220.  
  221.                         if(Node -> Special . BOOPSI . Link != NIL_LINK && Node -> Special . BOOPSI . TagLink)
  222.                         {
  223.                             if(!(Link = LTP_FindGadget(Handle,Node -> Special . BOOPSI . Link)))
  224.                             {
  225.                                 Handle -> Failed = TRUE;
  226.  
  227.                                 break;
  228.                             }
  229.                         }
  230.                         else
  231.                             Link = NULL;
  232.  
  233.                         if(Node -> Special . BOOPSI . ClassLibraryName)
  234.                         {
  235.                             if(!(Node -> Special . BOOPSI . ClassBase = OpenClass(Node -> Special . BOOPSI . ClassLibraryName)))
  236.                             {
  237.                                 Gadget = NULL;
  238.  
  239.                                 break;
  240.                             }
  241.                         }
  242.  
  243.                         if(Node -> Special . BOOPSI . FullWidth)
  244.                         {
  245.                             NewGadget . ng_LeftEdge    = Node -> Special . BOOPSI . Parent -> Left;
  246.                             NewGadget . ng_Width    = Node -> Special . BOOPSI . Parent -> Width;
  247.                         }
  248.  
  249.                         if(Node -> Special . BOOPSI . FullHeight)
  250.                         {
  251.                             NewGadget . ng_TopEdge    = Node -> Special . BOOPSI . Parent -> Top;
  252.                             NewGadget . ng_Height    = Node -> Special . BOOPSI . Parent -> Height;
  253.                         }
  254.  
  255.                         Gadget = NewObject(Node -> Special . BOOPSI . ClassInstance,Node -> Special . BOOPSI . ClassName,
  256.                             GA_Left,    NewGadget . ng_LeftEdge,
  257.                             GA_Top,        NewGadget . ng_TopEdge,
  258.                             GA_Width,    NewGadget . ng_Width,
  259.                             GA_Height,    NewGadget . ng_Height,
  260.                             GA_Disabled,    Node -> Disabled,
  261.                             GA_ID,        Node -> ID,
  262.                             GA_UserData,    Node,
  263.  
  264.                             Link ? Node -> Special . BOOPSI . TagLink : TAG_IGNORE,                        Link,
  265.                             Handle -> BOOPSIPrevious ? GA_Previous : TAG_IGNORE,                        Handle -> BOOPSIPrevious,
  266.                             Node -> Special . BOOPSI . TagTextAttr ? Node -> Special . BOOPSI . TagTextAttr : TAG_IGNORE,    Handle -> TextAttr,
  267.                             Node -> Special . BOOPSI . TagDrawInfo ? Node -> Special . BOOPSI . TagDrawInfo : TAG_IGNORE,    Handle -> DrawInfo,
  268.                             Node -> Special . BOOPSI . TagScreen ? Node -> Special . BOOPSI . TagScreen : TAG_IGNORE,    Handle -> Screen,
  269.                             Node -> Special . BOOPSI . ClassTags ? TAG_MORE : TAG_DONE,                    Node -> Special . BOOPSI . ClassTags);
  270.  
  271.                         break;
  272.                     }
  273.  
  274. #ifdef DO_POPUP_KIND
  275.                     case POPUP_KIND:
  276.  
  277.                         Gadget = NewObject(LTP_PopupClass,NULL,
  278.                             GA_Left,    NewGadget . ng_LeftEdge,
  279.                             GA_Top,        NewGadget . ng_TopEdge,
  280.                             GA_Width,    NewGadget . ng_Width,
  281.                             GA_Height,    NewGadget . ng_Height,
  282.                             GA_Disabled,    Node -> Disabled,
  283.                             GA_ID,        Node -> ID,
  284.                             GA_UserData,    Node,
  285.                             GA_RelVerify,    TRUE,
  286.                             PIA_Labels,    Node -> Special . Popup . Choices,
  287.                             PIA_Active,    Node -> Current,
  288.                             PIA_Font,    Handle -> TextAttr,
  289.  
  290.                             Handle -> BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle -> BOOPSIPrevious,
  291.                         TAG_DONE);
  292.  
  293.                         break;
  294. #endif    // DO_POPUP_KIND
  295.  
  296. #ifdef DO_TAB_KIND
  297.                     case TAB_KIND:
  298.  
  299.                         if(Node -> Special . Tab . FullWidth)
  300.                         {
  301.                             NewGadget . ng_LeftEdge    = Handle -> TopGroup -> Left    - Left;
  302.                             NewGadget . ng_Width    = Handle -> TopGroup -> Width    + PlusWidth;
  303.  
  304.                             NewGadget . ng_LeftEdge    += Handle -> Screen -> WBorLeft;
  305.                             NewGadget . ng_Width    -= Handle -> Screen -> WBorLeft + Handle -> Screen -> WBorRight;
  306.                         }
  307.                         else
  308.                         {
  309.                             NewGadget . ng_LeftEdge    = Node -> Special . Tab . Parent -> Left;
  310.                             NewGadget . ng_Width    = Node -> Special . Tab . Parent -> Width;
  311.                         }
  312.  
  313.                         Gadget = NewObject(LTP_TabClass,NULL,
  314.                             GA_Left,    NewGadget . ng_LeftEdge,
  315.                             GA_Top,        NewGadget . ng_TopEdge,
  316.                             GA_Width,    NewGadget . ng_Width,
  317.                             GA_Height,    NewGadget . ng_Height,
  318.                             GA_Disabled,    Node -> Disabled,
  319.                             GA_ID,        Node -> ID,
  320.                             GA_UserData,    Node,
  321.                             GA_RelVerify,    TRUE,
  322.                             TIA_Labels,    Node -> Special . Popup . Choices,
  323.                             TIA_Index,    Node -> Current,
  324.                             TIA_Font,    Handle -> TextAttr,
  325.                             TIA_DrawInfo,    Handle -> DrawInfo,
  326.                             TIA_Screen,    Handle -> Screen,
  327.  
  328.                             Handle -> BOOPSIPrevious ? GA_Previous : TAG_IGNORE,Handle -> BOOPSIPrevious,
  329.                         TAG_DONE);
  330.  
  331.                         break;
  332. #endif    // DO_TAB_KIND
  333. #endif    /* DO_BOOPSI_KIND */
  334.  
  335. #ifdef DO_LEVEL_KIND
  336.                     case LEVEL_KIND:
  337.  
  338.                         if(Node -> Special . Level . LevelImage = NewObject(LTP_LevelClass,NULL,
  339.                             IA_Width,    Node -> Width,
  340.                             IA_Height,    Node -> Height,
  341.                             IA_Left,    0,
  342.                             IA_Top,     0,
  343.                             LVIA_DrawInfo,    Handle -> DrawInfo,
  344.                             LVIA_FontWidth, Handle -> GlyphWidth,
  345.                             LVIA_Max,    Node -> Special . Level . Max    - Node -> Special . Level . Plus,
  346.                             LVIA_Current,    Node -> Special . Level . Level - Node -> Special . Level . Plus,
  347.                         TAG_DONE))
  348.                         {
  349.                             NewGadget . ng_GadgetText    = "";
  350.                             NewGadget . ng_Flags        = NULL;
  351.  
  352.                             if(Gadget = CreateGadgetA(GENERIC_KIND,Handle -> Previous,&NewGadget,NULL))
  353.                             {
  354.                                 Gadget -> GadgetType    |= GTYP_CUSTOMGADGET;
  355.  
  356.                                 Gadget -> Flags     = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
  357.                                 Gadget -> Activation    = GACT_RELVERIFY | GACT_IMMEDIATE | GACT_FOLLOWMOUSE;
  358.                                 Gadget -> MutualExclude = (ULONG)&Node -> Special . Level . CustomHook;
  359.                                 Gadget -> GadgetRender    = Node -> Special . Level . LevelImage;
  360.                                 Gadget -> SelectRender    = Node -> Special . Level . LevelImage;
  361.                                 Gadget -> SpecialInfo    = &Node -> Special . Level;
  362.  
  363.                                 if(Node -> Disabled)
  364.                                     Gadget -> Flags |= GFLG_DISABLED;
  365.                             }
  366.                         }
  367.  
  368.                         break;
  369. #endif    /* DO_LEVEL_KIND */
  370.                     case BUTTON_KIND:
  371.  
  372. #ifdef OLD_STYLE_DEFAULT_KEY
  373.                         if(Node -> Special . Button . Lines)
  374. #else
  375.                         if(Node -> Special . Button . ReturnKey)
  376.                             Handle -> TextAttr -> ta_Style |= FSF_BOLD;
  377.  
  378.                         if(Node -> Special . Button . Lines || Node -> Special . Button . ReturnKey)
  379. #endif
  380.                         {
  381.                             if(Node -> Special . Button . ButtonImage = NewObject(LTP_ImageClass,NULL,
  382.                                 IIA_ImageType,    IMAGECLASS_MULTILINEBUTTON,
  383.                                 IIA_Lines,    Node -> Special . Button . Lines,
  384.                                 IIA_LineCount,    Node -> Special . Button . LineCount,
  385.                                 IIA_KeyStroke,    Node -> Special . Button . KeyStroke,
  386.                                 IIA_Emboss,    Node -> Special . Button . ReturnKey,
  387.                                 IIA_Label,    Node -> Label,
  388.                                 IA_Width,    NewGadget . ng_Width,
  389.                                 IA_Height,    NewGadget . ng_Height,
  390.                             TAG_DONE))
  391.                             {
  392.                                 NewGadget . ng_GadgetText    = "";
  393.                                 NewGadget . ng_Flags        = NULL;
  394.  
  395.                                 if(Gadget = CreateGadgetA(GENERIC_KIND,Handle -> Previous,&NewGadget,NULL))
  396.                                 {
  397.                                     Gadget -> GadgetType    |= GTYP_BOOLGADGET;
  398.  
  399.                                     Gadget -> Flags     = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
  400.                                     Gadget -> Activation    = GACT_RELVERIFY;
  401.  
  402.                                     Gadget -> GadgetRender    = Node -> Special . Button . ButtonImage;
  403.                                     Gadget -> SelectRender    = Node -> Special . Button . ButtonImage;
  404.  
  405.                                     if(Node -> Disabled)
  406.                                         Gadget -> Flags |= GFLG_DISABLED;
  407.                                 }
  408.                             }
  409.                         }
  410.                         else
  411.                             Gadget = CreateGadgetA(BUTTON_KIND,Handle -> Previous,&NewGadget,Tags);
  412. #ifndef OLD_STYLE_DEFAULT_KEY
  413.                         if(Node -> Special . Button . ReturnKey)
  414.                             Handle -> TextAttr -> ta_Style &= ~FSF_BOLD;
  415. #endif
  416.                         break;
  417.  
  418.                     case GROUP_KIND:
  419.  
  420.                         LTP_LayoutGadgets(Handle,Node,Left,Top,PlusWidth,PlusHeight);
  421.  
  422.                         continue;
  423.  
  424.                     case CHECKBOX_KIND:
  425.  
  426.                         Gadget = CreateGadget(CHECKBOX_KIND,Handle -> Previous,&NewGadget,
  427.                             GTCB_Checked,    Node -> Current,
  428.                             GTCB_Scaled,    TRUE,
  429.                         TAG_MORE,Tags);
  430.  
  431.                         break;
  432.  
  433.                     case LISTVIEW_KIND:
  434.                     {
  435.                         struct TextFont *LocalFont;
  436.  
  437.                         if(!Node -> Special . List . ReadOnly && Node -> Special . List . LinkID != -1 && Node -> Special . List . LinkID != NIL_LINK)
  438.                             Gadget = Node -> Special . List . Link = LTP_FindGadget(Handle,Node -> Special . List . LinkID);
  439.                         else
  440.                             Gadget = NULL;
  441.  
  442.                         if((NewGadget . ng_Flags & PLACETEXT_ABOVE) && Node -> Label && Node -> Special . List . FlushLabelLeft)
  443.                             NewGadget . ng_GadgetText = "";
  444.  
  445.                         if(Node -> Special . List . TextAttr)
  446.                         {
  447.                                 // Use the system default font?
  448.  
  449.                             if(Node -> Special . List . TextAttr == (struct TextAttr *)~0)
  450.                             {
  451.                                 Forbid();
  452.  
  453.                                 LTP_GetDefaultFont(&Handle -> FixedFont);
  454.  
  455.                                 if(!(LocalFont = OpenFont((struct TextAttr *)&Handle -> FixedFont)))
  456.                                 {
  457.                                     Permit();
  458.  
  459.                                     Handle -> Failed = TRUE;
  460.  
  461.                                     Gadget = NULL;
  462.  
  463.                                     break;
  464.                                 }
  465.  
  466.                                 NewGadget . ng_TextAttr = (struct TextAttr *)&Handle -> FixedFont;
  467.                             }
  468.                             else
  469.                             {
  470.                                 NewGadget . ng_TextAttr = Node -> Special . List . TextAttr;
  471.  
  472.                                 LocalFont = NULL;
  473.                             }
  474.  
  475.                             NewGadget . ng_GadgetText = "";
  476.                         }
  477.  
  478.                         Gadget = CreateGadget(LISTVIEW_KIND,Handle -> Previous,&NewGadget,
  479.                             GTLV_Selected,        Node -> Current,
  480.                             GTLV_ReadOnly,        Node -> Special . List . ReadOnly,
  481.                             GTLV_ScrollWidth,    2 + 2 * Handle -> GlyphWidth + 2,
  482.  
  483.                             Node -> Current >= 0 ?            GTLV_Top:        TAG_IGNORE,Node -> Current,
  484.                             Node -> Current >= 0 ?            GTLV_MakeVisible:    TAG_IGNORE,Node -> Current,
  485.                             Node -> Special . List . Labels ?    GTLV_Labels:        TAG_IGNORE,Node -> Special . List . Labels,
  486.                             Node -> Special . List . LinkID != -1 ? GTLV_ShowSelected:    TAG_IGNORE,Gadget,
  487.                             Node -> Special . List . CallBack ?    GTLV_CallBack:        TAG_IGNORE,Node -> Special . List . CallBack,
  488.                             Node -> Special . List . MaxPen ?    GTLV_MaxPen:        TAG_IGNORE,Node -> Special . List . MaxPen,
  489.                         TAG_MORE,Tags);
  490.  
  491.                         if(Node -> Special . List . TextAttr)
  492.                         {
  493.                             NewGadget . ng_TextAttr = Handle -> TextAttr;
  494.  
  495.                             if(LocalFont)
  496.                             {
  497.                                 CloseFont(LocalFont);
  498.  
  499.                                 Permit();
  500.                             }
  501.                         }
  502.  
  503.                         break;
  504.                     }
  505.  
  506.                     case MX_KIND:
  507.  
  508.                         NewGadget . ng_Height = Handle -> RPort . TxHeight;
  509.  
  510.                         Gadget = CreateGadget(MX_KIND,Handle -> Previous,&NewGadget,
  511.                             GTMX_Labels,    Node -> Special . Radio . Choices,
  512.                             GTMX_Active,    Node -> Current,
  513.                             GTMX_Spacing,    Handle -> InterHeight,
  514.                             GTMX_Scaled,    TRUE,
  515.  
  516.                             Node -> Label ? GTMX_TitlePlace : TAG_IGNORE,  Node -> Special . Radio . TitlePlace,
  517.                         TAG_MORE,Tags);
  518.  
  519.                         break;
  520.  
  521.                     case TEXT_KIND:
  522.  
  523.                         if(Node -> Special . Text . UsePicker)
  524.                             NewGadget . ng_Width -= (4 + (((6 * Handle -> GlyphWidth) / 4) & ~1) + 1 + 4);
  525.  
  526.                         if(Gadget = CreateGadget(TEXT_KIND,Handle -> Previous,&NewGadget,
  527.                             GTTX_Border,        Node -> Special . Text . Border,
  528.                             GTTX_Justification,    Node -> Special . Text . Justification,
  529.  
  530.                             Node -> Special . Text . Text ? GTTX_Text : TAG_IGNORE,Node -> Special . Text . Text,
  531.                         TAG_MORE,Tags))
  532.                         {
  533.                             if(Node -> Special . Text . UsePicker)
  534.                             {
  535.                                 Extra = LTP_CreatePicker(Handle,Node,Gadget,&NewGadget);
  536.  
  537.                                 if(!Extra)
  538.                                     Gadget = NULL;
  539.  
  540.                                 Node -> Special . Text . Picker = Extra;
  541.                             }
  542.                         }
  543.  
  544.                         break;
  545. #ifdef DO_GAUGE_KIND
  546.                     case GAUGE_KIND:
  547.  
  548.                         NewGadget . ng_Height -= Handle -> InterHeight + Handle -> RPort . TxHeight + 2;
  549.  
  550.                         Gadget = CreateGadgetA(TEXT_KIND,Handle -> Previous,&NewGadget,NULL);
  551.  
  552.                         break;
  553. #endif
  554.  
  555. #ifdef DO_TAPEDECK_KIND
  556.                     case TAPEDECK_KIND:
  557.  
  558.                         if(Node -> Special . TapeDeck . ButtonType >= TDBT_BACKWARD && Node -> Special . TapeDeck . ButtonType < TDBTLAST)
  559.                         {
  560.                             LONG    ImageType;
  561.                             UWORD    Activation,
  562.                                 Flags;
  563.  
  564.                             if(Node -> Special . TapeDeck . Toggle)
  565.                                 Activation = GACT_TOGGLESELECT | GACT_IMMEDIATE;
  566.                             else
  567.                             {
  568.                                 if(Node -> Special . TapeDeck . Tick)
  569.                                 {
  570.                                     Activation = GACT_RELVERIFY | GACT_IMMEDIATE;
  571.  
  572.                                     Handle -> IDCMP |= IDCMP_GADGETDOWN | IDCMP_GADGETUP | IDCMP_INTUITICKS;
  573.                                 }
  574.                                 else
  575.                                     Activation = GACT_RELVERIFY;
  576.                             }
  577.  
  578.                             if(Node -> Current)
  579.                                 Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE | GFLG_SELECTED;
  580.                             else
  581.                                 Flags = GFLG_GADGIMAGE | GFLG_GADGHIMAGE;
  582.  
  583.                             switch(Node -> Special . TapeDeck . ButtonType)
  584.                             {
  585.                                 case TDBT_BACKWARD:
  586.  
  587.                                     ImageType = IMAGECLASS_BACKWARD;
  588.                                     break;
  589.  
  590.                                 case TDBT_FORWARD:
  591.  
  592.                                     ImageType = IMAGECLASS_FORWARD;
  593.                                     break;
  594.  
  595.                                 case TDBT_PREVIOUS:
  596.  
  597.                                     ImageType = IMAGECLASS_PREVIOUS;
  598.                                     break;
  599.  
  600.                                 case TDBT_NEXT:
  601.  
  602.                                     ImageType = IMAGECLASS_NEXT;
  603.                                     break;
  604.  
  605.                                 case TDBT_RECORD:
  606.  
  607.                                     ImageType = IMAGECLASS_RECORD;
  608.                                     break;
  609.  
  610.                                 case TDBT_PLAY:
  611.  
  612.                                     ImageType = IMAGECLASS_PLAY;
  613.                                     break;
  614.  
  615.                                 case TDBT_STOP:
  616.  
  617.                                     ImageType = IMAGECLASS_STOP;
  618.                                     break;
  619.  
  620.                                 case TDBT_PAUSE:
  621.  
  622.                                     ImageType = IMAGECLASS_PAUSE;
  623.                                     break;
  624.  
  625.                                 case TDBT_REWIND:
  626.  
  627.                                     ImageType = IMAGECLASS_REWIND;
  628.                                     break;
  629.  
  630.                                 case TDBT_EJECT:
  631.  
  632.                                     ImageType = IMAGECLASS_EJECT;
  633.                                     break;
  634.                             }
  635.  
  636.                             if(Node -> Special . TapeDeck . ButtonImage = NewObject(LTP_ImageClass,NULL,
  637.                                 IIA_ImageType,    ImageType,
  638.                                 IIA_GlyphWidth, Node -> Special . TapeDeck . ButtonWidth,
  639.                                 IIA_GlyphHeight,Node -> Special . TapeDeck . ButtonHeight,
  640.                                 IA_Width,    NewGadget . ng_Width,
  641.                                 IA_Height,    NewGadget . ng_Height,
  642.                             TAG_DONE))
  643.                             {
  644.                                 NewGadget . ng_GadgetText    = "";
  645.                                 NewGadget . ng_Flags        = NULL;
  646.  
  647.                                 if(Gadget = CreateGadgetA(GENERIC_KIND,Handle -> Previous,&NewGadget,NULL))
  648.                                 {
  649.                                     Gadget -> GadgetType    |= GTYP_BOOLGADGET;
  650.                                     Gadget -> Flags     |= Flags;
  651.                                     Gadget -> Activation    |= Activation;
  652.  
  653.                                     Gadget -> GadgetRender     = Node -> Special . TapeDeck . ButtonImage;
  654.                                     Gadget -> SelectRender     = Node -> Special . TapeDeck . ButtonImage;
  655.  
  656.                                     if(Node -> Disabled)
  657.                                         Gadget -> Flags |= GFLG_DISABLED;
  658.                                 }
  659.                             }
  660.                         }
  661.  
  662.                         break;
  663. #endif    /* DO_TAPEDECK_KIND */
  664.                     case NUMBER_KIND:
  665.  
  666.                         Gadget = CreateGadget(NUMBER_KIND,Handle -> Previous,&NewGadget,
  667.                             GTNM_Number,        Node -> Special . Number . Number,
  668.                             GTNM_Border,        Node -> Special . Number . Border,
  669.                             GTNM_Justification,    Node -> Special . Number . Justification,
  670.                             GTNM_Border,        Node -> Special . Number . Border,
  671.                             GTNM_Justification,    Node -> Special . Number . Justification,
  672.                             GTNM_Format,        Node -> Special . Number . Format ? Node -> Special . Number . Format : (STRPTR)"%ld",
  673.                         TAG_MORE,Tags);
  674.  
  675.                         break;
  676.  
  677.                     case CYCLE_KIND:
  678.  
  679.                         Gadget = CreateGadget(CYCLE_KIND,Handle -> Previous,&NewGadget,
  680.                             GTCY_Labels,        Node -> Special . Cycle . Choices,
  681.                             GTCY_Active,        Node -> Current,
  682.                         TAG_MORE,Tags);
  683.  
  684.                         break;
  685.  
  686.                     case PALETTE_KIND:
  687.  
  688.                         if(Node -> Special . Palette . UsePicker)
  689.                         {
  690.                             NewGadget . ng_Width = Node -> Special . Palette . IndicatorWidth;
  691.  
  692.                             if(Gadget = CreateGadget(TEXT_KIND,Handle -> Previous,&NewGadget,TAG_MORE,Tags))
  693.                             {
  694.                                 Extra = LTP_CreatePicker(Handle,Node,Gadget,&NewGadget);
  695.  
  696.                                 if(!Extra)
  697.                                     Gadget = NULL;
  698.  
  699.                                 Node -> Special . Palette . Picker = Extra;
  700.                             }
  701.                         }
  702.                         else
  703.                         {
  704.                             Gadget = CreateGadget(PALETTE_KIND,Handle -> Previous,&NewGadget,
  705.                                 GTPA_Depth,        Node -> Special . Palette . Depth,
  706.                                 GTPA_Color,        Node -> Current,
  707.                                 GTPA_ColorOffset,    Node -> Min,
  708.                                 GTPA_IndicatorWidth,    MAX(10,Node -> Width / (Node -> Max - Node -> Min + 1)),
  709.                                 GTPA_IndicatorHeight,    Node -> Height,
  710.  
  711.                                 Node -> Special . Palette . ColourTable ? GTPA_ColorTable : TAG_IGNORE,Node -> Special . Palette . ColourTable,
  712.                             TAG_MORE,Tags);
  713.                         }
  714.  
  715.                         break;
  716.  
  717.                     case SLIDER_KIND:
  718.  
  719.                         Gadget = CreateGadget(SLIDER_KIND,Handle -> Previous,&NewGadget,
  720.                             GTSL_Min,        Node -> Min,
  721.                             GTSL_Max,        Node -> Max,
  722.                             GTSL_Level,        Node -> Current,
  723.                             GTSL_MaxLevelLen,    Node -> Special . Slider . MaxLevelLen,
  724.                             GTSL_LevelPlace,    Node -> Special . Slider . LevelPlace,
  725.                             GTSL_LevelFormat,    Node -> Special . Slider . LevelFormat ? Node -> Special . Slider . LevelFormat : (STRPTR)"%ld",
  726.                             GA_RelVerify,        TRUE,
  727.  
  728.                             V40 ? GTSL_MaxPixelLen : TAG_IGNORE,    Node -> Special . Slider . LevelWidth,
  729.                             V40 ? GTSL_Justification : TAG_IGNORE,    GTJ_RIGHT,
  730.                             Node -> Special . Slider . DispFunc ? GTSL_DispFunc : TAG_IGNORE,Node -> Special . Slider . DispFunc,
  731.                         TAG_MORE,Tags);
  732.  
  733.                         break;
  734.  
  735.                     case SCROLLER_KIND:
  736.  
  737.                         Gadget = CreateGadget(SCROLLER_KIND,Handle -> Previous,&NewGadget,
  738.                             GA_RelVerify,    Node -> Special . Scroller . RelVerify,
  739.                             GA_Immediate,    Node -> Special . Scroller . Immediate,
  740.                             GTSC_Top,    Node -> Current,
  741.                             GTSC_Total,    Node -> Max,
  742.                             GTSC_Visible,    Node -> Special . Scroller . Visible,
  743.                             PGA_Freedom,    Node -> Special . Scroller . Vertical ? LORIENT_VERT : LORIENT_HORIZ,
  744.  
  745.                             Node -> Special . Scroller . Arrows ? GTSC_Arrows : TAG_IGNORE,Node -> Special . Scroller . ArrowSize,
  746.                         TAG_MORE,Tags);
  747.  
  748.                         break;
  749.  
  750.                     case STRING_KIND:
  751.  
  752.                         if(Node -> Special . String . LinkID != -1)
  753.                         {
  754.                             ObjectNode *ListView = LTP_FindNode(Handle -> TopGroup,Node -> Special . String . LinkID);
  755.  
  756.                             if(ListView)
  757.                             {
  758.                                 NewGadget . ng_LeftEdge = ListView -> Left;
  759.                                 NewGadget . ng_TopEdge    = ListView -> Top + ListView -> Height;
  760.                                 NewGadget . ng_Width    = ListView -> Width;
  761.                             }
  762.                         }
  763.  
  764.                         if(Node -> Special . String . UsePicker)
  765.                             NewGadget . ng_Width -= (4 + (((6 * Handle -> GlyphWidth) / 4) & ~1) + 1 + 4);
  766.  
  767.                         if(Gadget = CreateGadget(STRING_KIND,Handle -> Previous,&NewGadget,
  768.                             GTST_String,        Node -> Special . String . String,
  769.                             GTST_MaxChars,        Node -> Special . String . MaxChars,
  770.                             GTST_EditHook,        Node -> Special . String . EditHook ? Node -> Special . String . EditHook : Handle -> StandardEditHook,
  771.                             GA_Immediate,        TRUE,
  772.                             STRINGA_Justification,    Node -> Special . String . Justification,
  773.                             STRINGA_ExitHelp,    Handle -> HelpHook != NULL,
  774.                         TAG_MORE,Tags))
  775.                         {
  776.                             if(!V39)
  777.                                 Gadget -> Activation |= GACT_IMMEDIATE;
  778.  
  779.                             if(Node -> Special . String . UsePicker)
  780.                             {
  781.                                 Extra = LTP_CreatePicker(Handle,Node,Gadget,&NewGadget);
  782.  
  783.                                 if(!Extra)
  784.                                     Gadget = NULL;
  785.  
  786.                                 Node -> Special . String . Picker = Extra;
  787.                             }
  788.                         }
  789.  
  790.                         break;
  791. #ifdef DO_FRACTION_KIND
  792.                     case FRACTION_KIND:
  793.  
  794.                         if(Node -> Special . String . LinkID != -1)
  795.                         {
  796.                             ObjectNode *ListView = LTP_FindNode(Handle -> TopGroup,Node -> Special . String . LinkID);
  797.  
  798.                             if(ListView)
  799.                             {
  800.                                 NewGadget . ng_LeftEdge = ListView -> Left;
  801.                                 NewGadget . ng_TopEdge      = ListView -> Top + ListView -> Height;
  802.                                 NewGadget . ng_Width      = ListView -> Width;
  803.                             }
  804.                         }
  805.  
  806.                         /* ALWAYS */
  807.                         {
  808.                             UBYTE LocalBuffer[20];
  809.  
  810.                             sprintf(LocalBuffer,"%ld%lc%ld",Node -> Current / FIXED_UNITY,LTP_Locale ? LTP_Locale -> loc_DecimalPoint[0] : '.',Node -> Current % FIXED_UNITY);
  811.  
  812.                             if(Gadget = CreateGadget(STRING_KIND,Handle -> Previous,&NewGadget,
  813.                                 GTST_String,        LocalBuffer,
  814.                                 GTST_MaxChars,        Node -> Special . String . MaxChars > 12 ? 12 : Node -> Special . String . MaxChars,
  815.                                 GTST_EditHook,        &Handle -> FracEditHook,
  816.                                 GA_Immediate,        TRUE,
  817.                                 STRINGA_Justification,    Node -> Special . String . Justification,
  818.                                 STRINGA_ExitHelp,    Handle -> HelpHook != NULL,
  819.                             TAG_MORE,Tags))
  820.                             {
  821.                                 if(!V39)
  822.                                     Gadget -> Activation |= GACT_IMMEDIATE;
  823.                             }
  824.                         }
  825.  
  826.                         break;
  827. #endif
  828.  
  829. #ifdef DO_PASSWORD_KIND
  830.                     case PASSWORD_KIND:
  831.                     {
  832.                         WORD Len;
  833.  
  834.                         if(Len = strlen(Node -> Special . String . Original))
  835.                             memset(Node -> Special . String . Original,'·',Len);
  836.  
  837.                         if(Gadget = CreateGadget(STRING_KIND,Handle -> Previous,&NewGadget,
  838.                             GTST_String,        Node -> Special . String . Original,
  839.                             GTST_MaxChars,        Node -> Special . String . MaxChars,
  840.                             GTST_EditHook,        &Handle -> PasswordEditHook,
  841.                             GA_Immediate,        TRUE,
  842.                             STRINGA_Justification,    Node -> Special . String . Justification,
  843.                             STRINGA_ExitHelp,    Handle -> HelpHook != NULL,
  844.                         TAG_MORE,Tags))
  845.                         {
  846.                             if(!V39)
  847.                                 Gadget -> Activation |= GACT_IMMEDIATE;
  848.                         }
  849.  
  850.                         if(Len)
  851.                             strcpy(Node -> Special . String . Original,Node -> Special . String . RealString);
  852.  
  853.                         break;
  854.                     }
  855. #endif
  856.  
  857.                     case INTEGER_KIND:
  858.  
  859.                         if(Node -> Special . Integer . UseIncrementers)
  860.                         {
  861.                             NewGadget . ng_Width -= 4 + Handle -> GlyphWidth + 4;
  862.                             NewGadget . ng_Width -= 4 + Handle -> GlyphWidth + 4;
  863.  
  864.                             if(Node -> Special . Integer . IncrementerHook)
  865.                             {
  866.                                 LONG Value;
  867.  
  868.                                 Value = (LONG)CallHookPkt(Node -> Special . Integer . IncrementerHook,(APTR)Node -> Special . Integer . Number,(APTR)INCREMENTERMSG_INITIAL);
  869.  
  870.                                 if(Value < Node -> Min)
  871.                                     Value = Node -> Min;
  872.                                 else
  873.                                 {
  874.                                     if(Value > Node -> Max)
  875.                                         Value = Node -> Max;
  876.                                 }
  877.  
  878.                                 Node -> Special . Integer . Number = Value;
  879.                             }
  880.                         }
  881.  
  882. #ifndef DO_HEXHOOK
  883.                         Gadget = CreateGadget(INTEGER_KIND,Handle -> Previous,&NewGadget,
  884.                             GTIN_Number,        Node -> Special . Integer . Number,
  885.                             GTIN_MaxChars,        Node -> Special . Integer . MaxChars,
  886.                             GTIN_EditHook,        Node -> Special . Integer . EditHook ? Node -> Special . Integer . EditHook : Handle -> StandardEditHook,
  887.                             GA_Immediate,        TRUE,
  888.                             STRINGA_Justification,    Node -> Special . Integer . Justification,
  889.                             STRINGA_ExitHelp,    Handle -> HelpHook != NULL,
  890.                         TAG_MORE,Tags);
  891. #else
  892.                         if(Node -> Special . Integer . EditHook)
  893.                         {
  894.                             Gadget = CreateGadget(INTEGER_KIND,Handle -> Previous,&NewGadget,
  895.                                 GTIN_Number,        Node -> Special . Integer . Number,
  896.                                 GTIN_MaxChars,        Node -> Special . Integer . MaxChars,
  897.                                 GTIN_EditHook,        Node -> Special . Integer . EditHook,
  898.                                 GA_Immediate,        TRUE,
  899.                                 STRINGA_Justification,    Node -> Special . Integer . Justification,
  900.                                 STRINGA_ExitHelp,    Handle -> HelpHook != NULL,
  901.                             TAG_MORE,Tags);
  902.                         }
  903.                         else
  904.                         {
  905.                             UBYTE LocalBuffer[20];
  906.  
  907.                             sprintf(LocalBuffer,"%ld",Node -> Special . Integer . Number);
  908.  
  909.                             Gadget = CreateGadget(STRING_KIND,Handle -> Previous,&NewGadget,
  910.                                 GTST_String,        LocalBuffer,
  911.                                 GTST_MaxChars,        Node -> Special . Integer . MaxChars,
  912.                                 GTST_EditHook,        &Handle -> HexEditHook,
  913.                                 GA_Immediate,        TRUE,
  914.                                 STRINGA_Justification,    Node -> Special . Integer . Justification,
  915.                                 STRINGA_ExitHelp,    Handle -> HelpHook != NULL,
  916.                             TAG_MORE,Tags);
  917.                         }
  918.  
  919.                         if(Gadget)
  920.                         {
  921.                             struct StringInfo *StringInfo = (struct StringInfo *)Gadget -> SpecialInfo;
  922.  
  923.                             StringInfo -> LongInt = Node -> Special . Integer . Number;
  924.                         }
  925. #endif
  926.  
  927.                         if(Gadget)
  928.                         {
  929.                             if(!V39)
  930.                                 Gadget -> Activation |= GACT_IMMEDIATE;
  931.  
  932.                             if(Node -> Special . Integer . UseIncrementers)
  933.                             {
  934.                                 Handle -> Previous = Gadget;
  935.  
  936.                                 if(Node -> Special . Integer . LeftIncrementer = LTP_CreateIncrementer(Handle,Node,Gadget,&NewGadget,TRUE,-1))
  937.                                 {
  938.                                     Handle -> Previous = Node -> Special . Integer . LeftIncrementer;
  939.  
  940.                                     if(Node -> Special . Integer . RightIncrementer = LTP_CreateIncrementer(Handle,Node,Gadget,&NewGadget,FALSE,1))
  941.                                         Extra = Node -> Special . Integer . RightIncrementer;
  942.                                     else
  943.                                         Gadget = NULL;
  944.                                 }
  945.                                 else
  946.                                     Gadget = NULL;
  947.                             }
  948.                         }
  949.  
  950.                         break;
  951.                 }
  952.  
  953.                 if(Gadget)
  954.                 {
  955.                     Handle -> GadgetArray[Handle -> Index++] = Gadget;
  956.  
  957.                     Node -> Host = Gadget;
  958. #ifdef DO_BOOPSI_KIND
  959.                     if(Node -> Type == BOOPSI_KIND || Node -> Type == POPUP_KIND || Node -> Type == TAB_KIND)
  960.                     {
  961.                         Handle -> BOOPSIPrevious = (Object *)Gadget;
  962.  
  963.                         if(!Handle -> BOOPSIList)
  964.                             Handle -> BOOPSIList = (Object *)Gadget;
  965.                     }
  966.                     else
  967.                     {
  968.                         if(Extra)
  969.                             Handle -> Previous = Extra;
  970.                         else
  971.                             Handle -> Previous = Gadget;
  972.                     }
  973. #else
  974.                     if(Extra)
  975.                         Handle -> Previous = Extra;
  976.                     else
  977.                         Handle -> Previous = Gadget;
  978. #endif    /* DO_BOOPSI_KIND */
  979.                 }
  980.                 else
  981.                 {
  982.                     Handle -> Failed = TRUE;
  983.  
  984.                     return;
  985.                 }
  986.             }
  987.         }
  988.     }
  989. }
  990.